From 3588aeb4af12621b16faeac0ccb3001ebe48f0e9 Mon Sep 17 00:00:00 2001 From: Owen Taylor Date: Fri, 13 Feb 2004 03:03:21 +0000 Subject: [PATCH] Various reentrancy fixes for widgets being destroyed out of Thu Feb 12 21:58:20 2004 Owen Taylor Various reentrancy fixes for widgets being destroyed out of focus-out-event. (#128821, Grant Gayed) * gtk/gtkwindow.c (_gtk_window_unset_focus_and_default): Ref window and widget over callbacks. * gtk/gtkwidget.c (gtk_widget_hide) gtk/gtkwidget.c (gtk_widget_set_child_visible): Ref the widget before calling _gtk_window_unset_focus_and_default(), since that can call user callbacks. * gtk/gtkwidget.c (gtk_widget_invalidate_widget_windows): Do nothing if the widget isn't realized. --- ChangeLog | 16 ++++++++++++++++ ChangeLog.pre-2-10 | 16 ++++++++++++++++ ChangeLog.pre-2-4 | 16 ++++++++++++++++ ChangeLog.pre-2-6 | 16 ++++++++++++++++ ChangeLog.pre-2-8 | 16 ++++++++++++++++ gtk/gtkwidget.c | 10 +++++++++- gtk/gtkwindow.c | 6 ++++++ 7 files changed, 95 insertions(+), 1 deletion(-) diff --git a/ChangeLog b/ChangeLog index 5dff674309..f6c17e4a98 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,19 @@ +Thu Feb 12 21:58:20 2004 Owen Taylor + + Various reentrancy fixes for widgets being destroyed + out of focus-out-event. (#128821, Grant Gayed) + + * gtk/gtkwindow.c (_gtk_window_unset_focus_and_default): + Ref window and widget over callbacks. + + * gtk/gtkwidget.c (gtk_widget_hide) + gtk/gtkwidget.c (gtk_widget_set_child_visible): + Ref the widget before calling _gtk_window_unset_focus_and_default(), + since that can call user callbacks. + + * gtk/gtkwidget.c (gtk_widget_invalidate_widget_windows): + Do nothing if the widget isn't realized. + Fri Feb 13 01:31:44 2004 Matthias Clasen * gtk/gtkbutton.c (_gtk_button_paint): Don't draw bevels around diff --git a/ChangeLog.pre-2-10 b/ChangeLog.pre-2-10 index 5dff674309..f6c17e4a98 100644 --- a/ChangeLog.pre-2-10 +++ b/ChangeLog.pre-2-10 @@ -1,3 +1,19 @@ +Thu Feb 12 21:58:20 2004 Owen Taylor + + Various reentrancy fixes for widgets being destroyed + out of focus-out-event. (#128821, Grant Gayed) + + * gtk/gtkwindow.c (_gtk_window_unset_focus_and_default): + Ref window and widget over callbacks. + + * gtk/gtkwidget.c (gtk_widget_hide) + gtk/gtkwidget.c (gtk_widget_set_child_visible): + Ref the widget before calling _gtk_window_unset_focus_and_default(), + since that can call user callbacks. + + * gtk/gtkwidget.c (gtk_widget_invalidate_widget_windows): + Do nothing if the widget isn't realized. + Fri Feb 13 01:31:44 2004 Matthias Clasen * gtk/gtkbutton.c (_gtk_button_paint): Don't draw bevels around diff --git a/ChangeLog.pre-2-4 b/ChangeLog.pre-2-4 index 5dff674309..f6c17e4a98 100644 --- a/ChangeLog.pre-2-4 +++ b/ChangeLog.pre-2-4 @@ -1,3 +1,19 @@ +Thu Feb 12 21:58:20 2004 Owen Taylor + + Various reentrancy fixes for widgets being destroyed + out of focus-out-event. (#128821, Grant Gayed) + + * gtk/gtkwindow.c (_gtk_window_unset_focus_and_default): + Ref window and widget over callbacks. + + * gtk/gtkwidget.c (gtk_widget_hide) + gtk/gtkwidget.c (gtk_widget_set_child_visible): + Ref the widget before calling _gtk_window_unset_focus_and_default(), + since that can call user callbacks. + + * gtk/gtkwidget.c (gtk_widget_invalidate_widget_windows): + Do nothing if the widget isn't realized. + Fri Feb 13 01:31:44 2004 Matthias Clasen * gtk/gtkbutton.c (_gtk_button_paint): Don't draw bevels around diff --git a/ChangeLog.pre-2-6 b/ChangeLog.pre-2-6 index 5dff674309..f6c17e4a98 100644 --- a/ChangeLog.pre-2-6 +++ b/ChangeLog.pre-2-6 @@ -1,3 +1,19 @@ +Thu Feb 12 21:58:20 2004 Owen Taylor + + Various reentrancy fixes for widgets being destroyed + out of focus-out-event. (#128821, Grant Gayed) + + * gtk/gtkwindow.c (_gtk_window_unset_focus_and_default): + Ref window and widget over callbacks. + + * gtk/gtkwidget.c (gtk_widget_hide) + gtk/gtkwidget.c (gtk_widget_set_child_visible): + Ref the widget before calling _gtk_window_unset_focus_and_default(), + since that can call user callbacks. + + * gtk/gtkwidget.c (gtk_widget_invalidate_widget_windows): + Do nothing if the widget isn't realized. + Fri Feb 13 01:31:44 2004 Matthias Clasen * gtk/gtkbutton.c (_gtk_button_paint): Don't draw bevels around diff --git a/ChangeLog.pre-2-8 b/ChangeLog.pre-2-8 index 5dff674309..f6c17e4a98 100644 --- a/ChangeLog.pre-2-8 +++ b/ChangeLog.pre-2-8 @@ -1,3 +1,19 @@ +Thu Feb 12 21:58:20 2004 Owen Taylor + + Various reentrancy fixes for widgets being destroyed + out of focus-out-event. (#128821, Grant Gayed) + + * gtk/gtkwindow.c (_gtk_window_unset_focus_and_default): + Ref window and widget over callbacks. + + * gtk/gtkwidget.c (gtk_widget_hide) + gtk/gtkwidget.c (gtk_widget_set_child_visible): + Ref the widget before calling _gtk_window_unset_focus_and_default(), + since that can call user callbacks. + + * gtk/gtkwidget.c (gtk_widget_invalidate_widget_windows): + Do nothing if the widget isn't realized. + Fri Feb 13 01:31:44 2004 Matthias Clasen * gtk/gtkbutton.c (_gtk_button_paint): Don't draw bevels around diff --git a/gtk/gtkwidget.c b/gtk/gtkwidget.c index f43e994345..874a3d1360 100644 --- a/gtk/gtkwidget.c +++ b/gtk/gtkwidget.c @@ -2040,10 +2040,11 @@ gtk_widget_hide (GtkWidget *widget) if (GTK_WIDGET_VISIBLE (widget)) { GtkWidget *toplevel = gtk_widget_get_toplevel (widget); + + g_object_ref (widget); if (toplevel != widget && GTK_WIDGET_TOPLEVEL (toplevel)) _gtk_window_unset_focus_and_default (GTK_WINDOW (toplevel), widget); - g_object_ref (widget); g_signal_emit (widget, widget_signals[HIDE], 0); if (!GTK_WIDGET_TOPLEVEL (widget)) gtk_widget_queue_resize (widget); @@ -2613,6 +2614,9 @@ static void gtk_widget_invalidate_widget_windows (GtkWidget *widget, GdkRegion *region) { + if (!GTK_WIDGET_REALIZED (widget)) + return; + if (!GTK_WIDGET_NO_WINDOW (widget) && widget->parent) { int x, y; @@ -5114,6 +5118,8 @@ gtk_widget_set_child_visible (GtkWidget *widget, g_return_if_fail (GTK_IS_WIDGET (widget)); g_return_if_fail (!GTK_WIDGET_TOPLEVEL (widget)); + g_object_ref (widget); + if (is_visible) GTK_PRIVATE_SET_FLAG (widget, GTK_CHILD_VISIBLE); else @@ -5136,6 +5142,8 @@ gtk_widget_set_child_visible (GtkWidget *widget, else gtk_widget_unmap (widget); } + + g_object_unref (widget); } /** diff --git a/gtk/gtkwindow.c b/gtk/gtkwindow.c index 2fb60ba450..0e3c5f3db1 100644 --- a/gtk/gtkwindow.c +++ b/gtk/gtkwindow.c @@ -4562,6 +4562,9 @@ _gtk_window_unset_focus_and_default (GtkWindow *window, { GtkWidget *child; + + g_object_ref (window); + g_object_ref (widget); if (GTK_CONTAINER (widget->parent)->focus_child == widget) { @@ -4581,6 +4584,9 @@ _gtk_window_unset_focus_and_default (GtkWindow *window, if (child == widget) gtk_window_set_default (window, NULL); + + g_object_unref (widget); + g_object_unref (window); } /********************************* -- 2.30.2